package com.employment.dao;

import com.mybatisflex.core.BaseMapper;
import com.mybatisflex.core.paginate.Page;
import com.employment.entity.JobApplication;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 求职申请Mapper接口
 * 
 * @author Employment System
 * @since 1.0.0
 */
@Mapper
public interface JobApplicationMapper extends BaseMapper<JobApplication> {

    /**
     * 分页查询用户申请列表
     *
     * @param page   分页参数
     * @param userId 用户ID
     * @param status 申请状态
     * @return 申请分页列表
     */
    Page<JobApplication> selectUserApplicationPage(Page<JobApplication> page,
                                                  @Param("userId") Long userId,
                                                  @Param("status") Integer status);

    /**
     * 分页查询公司收到的申请列表
     *
     * @param page      分页参数
     * @param companyId 公司ID
     * @param jobId     职位ID
     * @param status    申请状态
     * @return 申请分页列表
     */
    Page<JobApplication> selectCompanyApplicationPage(Page<JobApplication> page,
                                                     @Param("companyId") Long companyId,
                                                     @Param("jobId") Long jobId,
                                                     @Param("status") Integer status);

    /**
     * 检查用户是否已申请该职位
     *
     * @param userId 用户ID
     * @param jobId  职位ID
     * @return 申请记录
     */
    JobApplication selectByUserAndJob(@Param("userId") Long userId,
                                    @Param("jobId") Long jobId);

    /**
     * 统计用户申请数据
     *
     * @param userId 用户ID
     * @return 统计数据
     */
    List<String> selectUserApplicationStats(@Param("userId") Long userId);

    /**
     * 统计公司申请数据
     *
     * @param companyId 公司ID
     * @return 统计数据
     */
    List<String> selectCompanyApplicationStats(@Param("companyId") Long companyId);

    /**
     * 查询待处理申请数量
     *
     * @param companyId 公司ID
     * @return 待处理数量
     */
    Integer countPendingApplications(@Param("companyId") Long companyId);

    /**
     * 批量更新申请状态
     *
     * @param applicationIds 申请ID列表
     * @param status         新状态
     * @param operatorId     操作人ID
     * @return 更新结果
     */
    int batchUpdateStatus(@Param("applicationIds") List<Long> applicationIds,
                         @Param("status") Integer status,
                         @Param("operatorId") Long operatorId);
}